package com.example.qa.adapter.in.web.controller;

import com.example.qa.adapter.in.web.dto.CreateQaRequestDTO;
import com.example.qa.adapter.in.web.dto.UpdateQaRequestDTO;
import com.example.qa.adapter.in.web.dto.QaResponseDTO;
import com.example.qa.service.application.command.CreateQaCommand;
import com.example.qa.service.application.command.UpdateQaCommand;
import com.example.qa.service.application.port.in.*;
import com.example.qa.service.domain.Qa;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Slf4j
@RequestMapping("/qas")
@RestController
@RequiredArgsConstructor
public class QaController {

    private final GetQaListUseCase getQaListUseCase;
    private final CreateQaUseCase createQaUseCase;
    private final DeleteQaUseCase deleteQaUseCase;
    private final UpdateQaUseCase updateQaUseCase;
    private final GetQaByIdUseCase getQaByIdUseCase;

    @GetMapping("")
    public List<Qa> getQas() {
        log.info("getQas");
        return getQaListUseCase.getQas();
    }

    @PostMapping()
    public Qa createQa(@RequestBody CreateQaRequestDTO createQaRequestDTO){

        CreateQaCommand command=CreateQaCommand.builder()
                .question(createQaRequestDTO.question())
                .answer(createQaRequestDTO.answer())
                .build();

        return createQaUseCase.createQa(command);
    }


    @DeleteMapping("{id}")
    public String deleteQa(@PathVariable("id") Long id){
        deleteQaUseCase.deleteQa(id);
        return "success";
    }

    /**
     * @author liuxin
     * @param updateQaRequestDTO
     * @return
     */
    @PutMapping("")
    public Qa updateQa(@RequestBody UpdateQaRequestDTO updateQaRequestDTO){
        UpdateQaCommand command=UpdateQaCommand.builder()
                .id(updateQaRequestDTO.id())
                .question(updateQaRequestDTO.question())
                .answer(updateQaRequestDTO.answer())
                .build();
        Qa qa = updateQaUseCase.updateQa(command);
        return qa;
    }


    /**
     * @author dengli
     * @param id
     * @return
     */
    @GetMapping("{id}")
    public QaResponseDTO getQaById(@PathVariable("id") Long id){
        Qa qa = getQaByIdUseCase.getQaById(id);
        QaResponseDTO qaResponseDTO = new QaResponseDTO(
                qa.getId().id(),
                qa.getQuestion().question(),
                qa.getAnswer().answer());
        return qaResponseDTO;
    }
}
